package gestorbienraizok.inmuebles;

import gestorbienraizok.contratos.Contrato;
import gestorbienraizok.usuarios.ClienteOferente;
import java.util.LinkedList;
import static uiMain.bienRaizOk.formatearPrecio;
import static uiMain.bienRaizOk.listaDeUnidades;

public abstract class Inmueble {

    protected String codigo;
    protected boolean patio;
    protected int areaTotal;
    protected byte rol;
    protected long tarifaDeArrendamiento;
    protected long precioDeVenta;
    protected byte disponibilidad;
    protected LinkedList<Cuarto> listaCuartos;
    protected ClienteOferente propietario;
    protected Contrato contrato;

    public Inmueble(String codigo, ClienteOferente propietario) {
        this.codigo = codigo;
        this.disponibilidad = 3;
        this.listaCuartos = new LinkedList();
        this.propietario = propietario;
        this.contrato = null;

    }

    public String getCodigo() {
        return this.codigo;
    }

    public int getAreaTotal() {
        return this.areaTotal;
    }

    public boolean tienePatio() {
        return patio;
    }

    public String getRol() {
        switch (this.rol) {
            case 1:
                return "Venta";
            case 2:
                return "Alquiler";
            case 3:
                return "Venta y alquiler";
            case 4:
                return "No disponible";
            default:
                return "";
        }
    }

    public String getDisponibilidad() {
        switch (this.disponibilidad) {
            case 1:
                return "Vendida";
            case 2:
                return "Arrendada";
            case 3:
                return "Disponible";
            default:
                return "";
        }
    }

    public void setDisponibilidad(byte nuevaDisponibilidad) {
        this.disponibilidad = nuevaDisponibilidad;
    }

    public LinkedList<Cuarto> getListaCuartos() {
        return this.listaCuartos;
    }

    public long getTarifaDeArrendamiento() {
        return this.tarifaDeArrendamiento;
    }

    public long getPrecioDeVenta() {
        return this.precioDeVenta;
    }

    public ClienteOferente getPropietario() {
        return this.propietario;
    }

    public void setAreaTotal(int areaTotal) {
        this.areaTotal = areaTotal;
    }

    public void setPatio(boolean patio) {
        this.patio = patio;
    }

    public void setRol(byte rol) {
        this.rol = rol;
    }

    public void setTarifaDeArrendamiento(long tarifaDeArrendamiento) {
        this.tarifaDeArrendamiento = tarifaDeArrendamiento;
    }

    public void setPrecioDeVenta(long precioDeVenta) {
        this.precioDeVenta = precioDeVenta;
    }

    public void anhadirCuarto(Cuarto cuarto) {
        this.listaCuartos.add(cuarto);
    }

    public static Inmueble buscarInmueble(String codigo) {

        String tipoDePropiedad = codigo.substring(0, 1);

        if (tipoDePropiedad.equalsIgnoreCase("c")) {//Caso apartamento
            for (int i = 0; i < listaDeUnidades.size(); i++) {
                LinkedList<Casa> estaListaDeCasas = listaDeUnidades.get(i).getListaDeCasas();
                for (int j = 0; j < estaListaDeCasas.size(); j++) {
                    Casa estaCasa = estaListaDeCasas.get(j);
                    if (estaCasa.getCodigo().equalsIgnoreCase(codigo)) {
                        return estaCasa;
                    }
                }
            }
        } else {
            for (int i = 0; i < listaDeUnidades.size(); i++) {
                LinkedList<Torre> estaListaDeTorres = listaDeUnidades.get(i).getListaDeTorres();
                for (int j = 0; j < estaListaDeTorres.size(); j++) {
                    LinkedList<Apartamento> estaListaDeAptos = estaListaDeTorres.get(j).getListaDeApartamentos();
                    for (int k = 0; k < estaListaDeAptos.size(); k++) {
                        Apartamento esteApto = estaListaDeAptos.get(k);
                        if (esteApto.getCodigo().equalsIgnoreCase(codigo)) {
                            return esteApto;
                        }
                    }
                }
            }
        }
        return null;
    }

    public byte numeroDeBanhos() {
        byte total = 0;
        for (int i = 0; i < this.listaCuartos.size(); i++) {
            Cuarto esteCuarto = this.listaCuartos.get(i);
            if (esteCuarto instanceof Banho) {
                total++;
            }
        }
        return total;
    }

    public byte numeroDePiezas() {
        return (byte) (this.listaCuartos.size() - this.numeroDeBanhos());
    }

    public void asignarContrato(Contrato contrato) {
        this.contrato = contrato;
    }

    public Contrato getContrato() {
        return this.contrato;
    }

    public Unidad getUnidad() {
        if (this instanceof Apartamento) {
            Apartamento esteApartamento = (Apartamento) this;
            return esteApartamento.getUnidad();
        } else {
            Casa estaCasa = (Casa) this;
            return estaCasa.getUnidad();
        }
    }

    public String getResumen() {

        String descripcion = new String();

        descripcion += String.format("%-9s", this.codigo);

        String tipo = ((this instanceof Apartamento) ? "Apartamento" : "Casa");
        descripcion += String.format("%-14s", tipo);

        String direccion = this.getUnidad().getDireccion();
        descripcion += String.format("%-19s", direccion);

        String rol = this.getRol();
        descripcion += String.format("%-19s", rol);

        if (rol.equalsIgnoreCase("Venta")) {
            String precioVenta = formatearPrecio(this.precioDeVenta);
            descripcion += String.format("%-18s", precioVenta);
            descripcion += "-                         ";
        } else if (rol.equalsIgnoreCase("Alquiler")) {
            descripcion += "-                 ";
            String tarifaArrendamiento = formatearPrecio(this.tarifaDeArrendamiento);
            descripcion += String.format("%-26s", tarifaArrendamiento);
        } else if (rol.equalsIgnoreCase("Venta y alquiler")) {
            String precioVenta = formatearPrecio(this.precioDeVenta);
            descripcion += String.format("%-18s", precioVenta);

            String tarifaArrendamiento = formatearPrecio(this.tarifaDeArrendamiento);
            descripcion += String.format("%-26s", tarifaArrendamiento);
        } else {
            descripcion += "-                 -                         ";
        }

        if (this.contrato != null) {
            String tipoContrato = this.contrato.tipoDeContrato();
            descripcion += String.format("%-19s", tipoContrato);

            String dia = String.format("%2d", this.contrato.getDia()).replace(" ", "0");
            String mes = String.format("%2d", this.contrato.getMes()).replace(" ", "0");
            String fechaDiaMesAnho = dia + "/" + mes + "/" + this.contrato.getAnho();
            descripcion += String.format("%-14s", fechaDiaMesAnho);

            descripcion += formatearPrecio(this.contrato.getValor());
        } else {
            descripcion += "-                  -             -";
        }

        return descripcion;
    }

}
